package com.company.method;

import com.company.class1.Person;

import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;

public class TestMethodDemo {

    public static void main(String[] args) throws NoSuchMethodException, InvocationTargetException, IllegalAccessException {

        Class c = Person.class;
        // 得到所有public的方法，包含从父类继承过来的方法
        Method[] ms1 = c.getMethods();
        for(Method m:ms1)
        {
            System.out.println(m.toGenericString());
        }
        System.out.println("-----------------");

        //得到本类的所有方法，包括private
        Method[] ms2 = c.getDeclaredMethods();
        for(Method m:ms2)
        {
            System.out.println(m.toGenericString());
        }
        System.out.println("-----------------");

        //得到单个public方法
        Method m1 = c.getMethod("work",new Class[]{});
        System.out.println(m1);
        System.out.println("-----------------");

        Person p = new Person();
        p.setName("赵六");
        //得到单个方法，可以得到private，但是必须使用setAccessible(true)
        Method m2 = c.getDeclaredMethod("sleep",new Class[]{});
        m2.setAccessible(true);
        //执行
        m2.invoke(p);
        System.out.println(m2);
        System.out.println("-----------------");

        // 静态方法，没有对象，需要传入null
        Method m3 = c.getMethod("aaa");
        m3.invoke(null);
    }
}
